iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

IT工作中曾遇到的問題系列 第 6

使用powershell的Invoke-RestMethod呼叫REST API

  • 分享至 

  • xImage
  •  

通常我會使用Postman或curl來測試REST API,不過這兩個工具都需要額外安裝。

我自己有寫一個REST API供Winodws系統排程使用,所以需要用指令來撰寫Script。

在查了一下Powershell的指令集後,發現可以利用Invoke-RestMethod指令來完成。

GET測試

我的語法如下,要注意的是下列語法是同一行,只是用「`」來分行:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo04/temp' `
    -Method 'GET' `
    -Headers @{ "Content-Type" = "application/json"; }

https://ithelp.ithome.com.tw/upload/images/20230914/20156403bIAqb2VMpb.png
成功傳回資料,但是由上圖可知顯示的格式是已經分析response的json,而且如果資料過長,就會被截斷如下圖
https://ithelp.ithome.com.tw/upload/images/20230914/20156403VvZHc6ZzVg.png
可以加上ConvertTo-Json,顯示JSON的原貌

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo04/temp' `
    -Method 'GET' `
    -Headers @{ "Content-Type" = "application/json"; } `
    | ConvertTo-Json

https://ithelp.ithome.com.tw/upload/images/20230914/20156403jLIJEzomhK.png

POST測試

要request的json如右:{"name"="9527"; "job"="長工"},我的語法如下:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo02/plsql01' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json" } `
    -Body ((@{"name"="9527"; "job"="長工"})|ConvertTo-Json)

要注意的是-Body這一行,除了利用管線「|」來轉成json之外,其括弧()也是不可以省略的,也可以用變數的方式來取代

$DATA = @{"name"="9527"; "job"="長工"}

Body的值改為-Body ($DATA|ConvertTo-Json)

此外,因為json上有中文字,所以還需要針對中文來進行編碼(utf-8),以免變成亂碼,所以修正後的語法如下:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo02/plsql01' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json";"charset"="utf-8" } `
    -Body ([System.Text.Encoding]::UTF8.GetBytes(((@{"name"="9527"; "job"="長工"})|ConvertTo-Json)))

如果是比較複雜的json,範例如下

{
    "site": "test",
    "List": [
        "A1",
        "A2"]
}

可以寫成:

$BODY_DATA = @{
    "site" = "test" ;
    "List" = @(
        "A1",
        "A2") 
}

POST測試2

這次是用form來request資料,不過因為目前我只有json的REST api,所以就先記錄一下。

檔案的部份用get-item來取得,其語法如下:

$Form = @{
    Name  = "A001"
    photo = Get-Item -Path 'd:\test.png'
}

$Result = Invoke-RestMethod -Uri "http://test.com" -Method Post -Form $Form

利用Windows內建的powershell就可以使用REST API,真的太方便了。

本篇參考我的blog:https://blog.twtnn.com/


上一篇
Windows batch script:用findstr來搜尋指定的字串
下一篇
Oracle DB:ORA-01950: no privileges on tablespace 'XXXXX'
系列文
IT工作中曾遇到的問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言